package com.wlc.io;

import java.io.*;
import java.util.Arrays;
import java.util.Date;
import java.util.stream.Collectors;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description 流
 * @date 2021-07-01 18:05
 */
public class Demo01 {

    /**
     * 绝对路径和相对路径
     */
    public void method01() {

        String filePath = "/Users/wanglichao/Desktop/temp/2021.txt";
        // 绝对路径
        File f1 = new File(filePath);
        System.out.println("file.getAbsolutePath() = " + f1.getAbsolutePath());
        System.out.println("f1是否存在 = " + f1.exists());
        System.out.println("f1文件是否存在 " + f1.exists());
        System.out.println("是否是文件夹" + f1.isDirectory());
        System.out.println("是否是文件" + f1.isFile());
        System.out.println("文件的长度" + f1.length());
        System.out.println("f1最后修改时间为： " + new Date(f1.lastModified()));
        File f2 = new File("/Users/wanglichao/Desktop/temp/2022.txt");
        // 把f1 的文件修改为了f2的文件
        f1.renameTo(f2);
        System.out.println("f1.exists() = " + f1.exists());
        File f3 = new File("/Users/wanglichao/Desktop/temp/2024.txt");
        try {
            // 创建一个新文件
            f3.createNewFile();
        } catch (IOException e) {
            System.out.println("创建新文件失败，原因是： " + e.getMessage());
        }
        System.out.println("f3文件是否存在： " + f3.exists());


    }

    /**
     * file 文件流常用的方法
     */
    public void method02() {
        String filePath = "/Users/wanglichao/Desktop/temp/test";
        File file = new File(filePath);

        file.mkdir();


        // file.list() 以数组的形式返回所有的文件
        String[] list = file.list();
        Arrays.stream(list).collect(Collectors.toList()).forEach(System.out::println);
        // file.getParent() 返回当前文件的父文件
        System.out.println("file.getParent() = " + file.getParent());
        // 获取当前文件的所有父文件（当前桌面所有的文件）
        File parentFile = file.getParentFile();
        System.out.println("parentFile.exists() = " + parentFile.exists());
        Arrays.stream(parentFile.list()).collect(Collectors.toList()).forEach(System.out::println);
        System.out.println("=====");
        String[] list1 = file.list();
        Arrays.stream(list1).forEach(System.out::println);
        // file.delete 删除文件
        file.delete();

    }

    /**
     * file 文件流常用的方法2
     */
    public void method03() {
        String filePath = "/Users/wanglichao/environment/abc/hhh/tool";
        File file = new File(filePath);
        String parent = file.getParent();
        System.out.println("parent = " + parent);
        /*File parentFile = file.getParentFile();
        Arrays.stream(parentFile.list()).forEach(System.out::println);*/
        // 此时 tool 的父文件夹 abc不存在， file.mkdir 不起作用；调用file.createNewFile会抛出异常
        /*file.mkdir();
        System.out.println("文件是否存在： = " + file.exists());
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }*/
        // file.mkdirs:  当父文件夹不存在的时候，会先创建父文件
       /* file.mkdirs();
        System.out.println("file是否存在： = " + file.exists());
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }*/
        // 创建一个不存在的空文件夹的时候，要先获取到父文件夹，然后先创建父文件夹
        /*boolean mkdirs = file.getParentFile().mkdirs();
        System.out.println("mkdirs = " + mkdirs);
        System.out.println("file.exists() = " + file.exists());*/

        file.mkdirs();
        System.out.println("file.exists() = " + file.exists());
    }

    /**
     * 文件输入流
     */
    public void method04() {
        File file = new File("/Users/wanglichao/Desktop/temp/2022.txt");
        FileInputStream fileInputStream = null;
        try {
            // 通过这个文件输入流，就可以把外部数据读取到Java虚拟机中JVM来，也就是内存中
            fileInputStream = new FileInputStream(file);

            // 创建字节数组，长度就是文件的长度
            byte[] bytes = new byte[(int) file.length()];
            // 通过文件输入流读取字节数组
            fileInputStream.read(bytes);
            for (byte b : bytes) {
                // 读取到的内容是ASCII表中对应的数字
                System.out.println("字节的内容为：" + b);
            }


        } catch (IOException e) {
            System.out.println("文件输入流发生错误，原因是：" + e.getMessage());
        } finally {
            if (null != fileInputStream) {
                try {
                    fileInputStream.close();
                    System.out.println("字节流已经关闭了");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 文件输出流 FileOutPutStream
     */
    public void method05() {
        File file = new File("/Users/wanglichao/Desktop/temp/test1/2022.txt");
        FileOutputStream fileOutputStream = null;
        try {
            // TODO 注意： 如果 2022.txt的父文件test1 文件夹不存在的时候，会报错，所以，在写入文件的时候，要先判断父级文件夹是否
            // 存在不存在就先创建父级文件夹
            // 获取父级文件夹
            // 写入数据的时候，如果文件不存在，会先创建文件
            File parentFile = file.getParentFile();
            if (!parentFile.exists()) {
                parentFile.mkdirs();
            }


            // 1、通过这个文件输出流，就可以把JavaJVM中 内存 的文件输出到外部磁盘上面
            fileOutputStream = new FileOutputStream(file);

            // 2、定义一个字节数组
            byte[] data = {88, 89, 90};


            // 3、通过文件输出流把文件写入到文件中
            fileOutputStream.write(data);
            System.out.println("文件写入完毕。");


        } catch (IOException e) {
            System.out.println("文件输出流发生错误，原因是：" + e.getMessage());
        } finally {
            if (null != fileOutputStream) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    System.out.println("文件关闭发生错误！原因是：" + e.getMessage());
                }
            }
        }
    }


    public static void main(String[] args) {
        Demo01 demo01 = new Demo01();
        demo01.method05();
    }

}
